package com.eol.common.sms;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.eol.common.config.SystemPropertiesConfig;
import com.eol.common.exception.BaseException;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * Created with IntelliJ IDEA.
 * User: liulinhui
 * Date: 17-12-15
 * Time: 下午1:17
 * Description: 阿里云发短信
 */
@Slf4j
@Component
public class SMSUtils {

    @Resource
    private SystemPropertiesConfig systemPropertiesConfig;

    //产品名称:云通信短信API产品,开发者无需替换
    private static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    private static final String domain = "dysmsapi.aliyuncs.com";

    private static final String regionId = "cn-hangzhou";

    /**
     * 短息发送
     *
     * @param smsDto
     * @return
     */
    public SendSmsResponse send(SMSDto smsDto) {
        SendSmsResponse sendSmsResponse;
        try {
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");

            //初始化acsClient,暂不支持region化
            SystemPropertiesConfig.AliYunSms aliYunSms = systemPropertiesConfig.getAliYunSms();
            IClientProfile profile = DefaultProfile.getProfile(regionId, aliYunSms.getAccessKeyId(), aliYunSms.getAccessKeySecret());
            DefaultProfile.addEndpoint(regionId, regionId, product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(smsDto.getPhoneNum());
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(aliYunSms.getSignName());
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(smsDto.getTemplateCode());
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam(smsDto.getTemplateParam());
            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            if (!StringUtil.isNullOrEmpty(smsDto.getExtendCode()))
                request.setSmsUpExtendCode(smsDto.getExtendCode());

            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            if (!StringUtil.isNullOrEmpty(smsDto.getOutId()))
                request.setOutId(smsDto.getOutId());
            else request.setOutId("yourOutId");
            sendSmsResponse = acsClient.getAcsResponse(request);
        } catch (Exception e) {
            log.error(ExceptionUtils.getStackTrace(e));
            throw new BaseException("短信发送失败");
        }

        log.info("发送短信：" + JSONObject.toJSONString(sendSmsResponse));
        return sendSmsResponse;
    }


}
